<?

class Load {

	public static $instancia = null;
	private $rendered = array();
	private $autorender = true;
	public $template = null;
	private $_template = null;
	private $controller = null;
	private $method = null;
	private $prefix = null;
	private $args = array();
	private $data = array();

	function __construct () {
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	function model ($model) {
		// Le agrego "Model" al nombre de la clase
		$classname = $model."Model";

		// Si existe el modelo, lo instancio y lo devuelvo
		if (class_exists($classname))
			return new $classname();

		// Devuelvo una nueva instancia de Model para la tabla en cuestion
		return new Model($model);
	}
	
	function view ($view=null, $data=array()) {

		$View = new View($view);

//echo '<pre>pepe:'.print_r($data, true).'</pre>';

		$data = array_merge($this->data(), $data);

		$View->autorender = $this->autorender;

		// Si la pude incluir, la agrego al listado de vistas renderizadas
		if ($res = $View->display($data))
			$this->rendered[$view];

		return $res;
			
	}

	function data ($data=null) {
		
		if ($data)
			$this->data = $data;

		return $this->data;
	}

	function autorender ($autorender=null) {

		// Si recibi parametros, lo seteo
		if ($autorender!==null)
			$this->autorender = (boolean)$autorender;

		return (bool)$this->autorender;
	}

	function rendered ($view) {
		return (bool)$this->rendered[$view];
	}

	function template ($template=null) {

		if ($template === false)
			$this->template = false;

		if (!$template && ($this->template === false))
			return false;
		
		if (!$this->template)
			$this->template = Template::getInstance();
		
		if ($data = $this->data())
			$this->template->data($data);

		return $this->template->template($template);
	}

	function controller ($controller=null) {
		if ($controller)
			$this->_controller = $controller;
		return $this->_controller;
	}

	function method ($method=null) {
		if ($method)
			$this->_method = $method;
		return $this->_method;
	}

	function prefix ($prefix=null) {
		if ($prefix)
			$this->prefix = $prefix;
		return $this->prefix;
	}

	function args ($_args=null) {

		if (!$_args)
			return $this->args;
		foreach ($_args as $_key => $_arg) {

				// Obtengo el key y el val
				if (!is_numeric($_key)) {
					$args[$_key] = $_arg;
					continue;
				}

				list($key, $val) = explode(':', $_arg, 2);
		
				// Si es filter, no separo nada
				if ($key == 'filter') 
					$args['filter'][] = $val;
				else {
					// Si tiene comas, lo convierto en un array
					if (preg_match('/.*?\,.*?/i', $val))
						$val = explode(',', $val);
					// Si val tiene ":", entonces es un key-value pair
					if (preg_match('/^[^ ]+:/i', $val) && list($key2, $val2) = explode(':', $val, 2))
						$args[$key][$key2] = urldecode($val2);
					// Si ya existe el key, entonces lo convierto en array
					else if ($args[$key]) {
						if (!is_array($args[$key])) {
							$args[$key] = array($args[$key]);
						}
						$args[$key][] = $val;
					}
					else
						$args[$key] = (is_array($val) && !is_array($args[$key])) ? array($val) : urldecode($val);
				}
			}

		// Almaceno los argumentos
		$this->args = $args;

		return $args;
	}

	function component ($component=null) {

		$Controller = new Component($view);

		$View->autorender = $this->autorender;

		// Si la pude incluir, la agrego al listado de vistas renderizadas
		if ($res = $View->display($data))
			$this->rendered[$view];



			
	}

}

?>
